<?php

/**
 * JPGraph v4.0.3
 */

namespace lemon\JpGraph\Plot;

use lemon\JpGraph\Graph;
use lemon\JpGraph\Image;
use lemon\JpGraph\Util;

/**
 * File:		JPGRAPH_ICONPLOT.PHP
 * // Description: Extension module to add icons to plots
 * // Created:	 2004-02-18
 * // Ver:		 $Id: jpgraph_iconplot.php 1404 2009-06-28 15:25:41Z ljp $
 * //
 * // Copyright (c) Asial Corporation. All rights reserved.
 */

/**
 * @class IconPlot
 * // Description: Make it possible to add a (small) image
 * // to the graph
 */
class IconPlot
{
	public $iX			   = 0;
	public $iY			   = 0;
	public $iScale		   = 1.0;
	public $iMix			 = 100;
	private $iHorAnchor	  = 'left';
	private $iVertAnchor	 = 'top';
	private $iFile		   = '';
	private $iAnchors		= ['left', 'right', 'top', 'bottom', 'center'];
	private $iCountryFlag	= '';
	private $iCountryStdSize = 3;
	private $iScalePosY;
	private $iScalePosX;
	private $iImgString = '';

	public function __construct($aFile = '', $aX = 0, $aY = 0, $aScale = 1.0, $aMix = 100)
	{
		$this->iFile  = $aFile;
		$this->iX	 = $aX;
		$this->iY	 = $aY;
		$this->iScale = $aScale;
		if ($aMix < 0 || $aMix > 100) {
			Util\JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.');
		}
		$this->iMix = $aMix;
	}

	public function SetCountryFlag($aFlag, $aX = 0, $aY = 0, $aScale = 1.0, $aMix = 100, $aStdSize = 3)
	{
		$this->iCountryFlag = $aFlag;
		$this->iX		   = $aX;
		$this->iY		   = $aY;
		$this->iScale	   = $aScale;
		if ($aMix < 0 || $aMix > 100) {
			Util\JpGraphError::RaiseL(8001); //'Mix value for icon must be between 0 and 100.');
		}
		$this->iMix			= $aMix;
		$this->iCountryStdSize = $aStdSize;
	}

	public function SetPos($aX, $aY)
	{
		$this->iX = $aX;
		$this->iY = $aY;
	}

	public function CreateFromString($aStr)
	{
		$this->iImgString = $aStr;
	}

	public function SetScalePos($aX, $aY)
	{
		$this->iScalePosX = $aX;
		$this->iScalePosY = $aY;
	}

	public function SetScale($aScale)
	{
		$this->iScale = $aScale;
	}

	public function SetMix($aMix)
	{
		if ($aMix < 0 || $aMix > 100) {
			Util\JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.');
		}
		$this->iMix = $aMix;
	}

	public function SetAnchor($aXAnchor = 'left', $aYAnchor = 'center')
	{
		if (!in_array($aXAnchor, $this->iAnchors, true) ||
			!in_array($aYAnchor, $this->iAnchors, true)) {
			Util\JpGraphError::RaiseL(8002); //("Anchor position for icons must be one of 'top', 'bottom', 'left', 'right' or 'center'");
		}
		$this->iHorAnchor  = $aXAnchor;
		$this->iVertAnchor = $aYAnchor;
	}

	public function PreStrokeAdjust($aGraph)
	{
		// Nothing to do ...
	}

	public function DoLegend($aGraph)
	{
		// Nothing to do ...
	}

	public function Max()
	{
		return [false, false];
	}

	// The next four function are framework function tht gets called
	// from Gantt and is not menaiungfull in the context of Icons but
	// they must be implemented to avoid errors.
	public function GetMaxDate()
	{
		return false;
	}

	public function GetMinDate()
	{
		return false;
	}

	public function GetLineNbr()
	{
		return 0;
	}

	public function GetAbsHeight()
	{
		return 0;
	}

	public function Min()
	{
		return [false, false];
	}

	public function StrokeMargin(&$aImg)
	{
		return true;
	}

	public function Stroke($aImg, $axscale = null, $ayscale = null)
	{
		$this->StrokeWithScale($aImg, $axscale, $ayscale);
	}

	public function StrokeWithScale($aImg, $axscale, $ayscale)
	{
		if ($this->iScalePosX === null || $this->iScalePosY === null ||
			$axscale === null || $ayscale === null) {
			$this->_Stroke($aImg);
		} else {
			$this->_Stroke(
				$aImg,
				round($axscale->Translate($this->iScalePosX)),
				round($ayscale->Translate($this->iScalePosY))
			);
		}
	}

	public function GetWidthHeight()
	{
		$dummy = 0;

		return $this->_Stroke($dummy, null, null, true);
	}

	public function _Stroke($aImg, $x = null, $y = null, $aReturnWidthHeight = false)
	{
		if ($this->iFile != '' && $this->iCountryFlag != '') {
			Util\JpGraphError::RaiseL(8003); //('It is not possible to specify both an image file and a country flag for the same icon.');
		}
		if ($this->iFile != '') {
			$gdimg = Graph\Graph::LoadBkgImage('', $this->iFile);
		} elseif ($this->iImgString != '') {
			$gdimg = Image\Image::CreateFromString($this->iImgString);
		} else {
			$fobj  = new Image\FlagImages($this->iCountryStdSize);
			$dummy = '';
			$gdimg = $fobj->GetImgByName($this->iCountryFlag, $dummy);
		}

		$iconw = imagesx($gdimg);
		$iconh = imagesy($gdimg);

		if ($aReturnWidthHeight) {
			return [round($iconw * $this->iScale), round($iconh * $this->iScale)];
		}

		if ($x !== null && $y !== null) {
			$this->iX = $x;
			$this->iY = $y;
		}
		if ($this->iX >= 0 && $this->iX <= 1.0) {
			$w		= imagesx($aImg->img);
			$this->iX = round($w * $this->iX);
		}
		if ($this->iY >= 0 && $this->iY <= 1.0) {
			$h		= imagesy($aImg->img);
			$this->iY = round($h * $this->iY);
		}

		if ($this->iHorAnchor == 'center') {
			$this->iX -= round($iconw * $this->iScale / 2);
		}

		if ($this->iHorAnchor == 'right') {
			$this->iX -= round($iconw * $this->iScale);
		}

		if ($this->iVertAnchor == 'center') {
			$this->iY -= round($iconh * $this->iScale / 2);
		}

		if ($this->iVertAnchor == 'bottom') {
			$this->iY -= round($iconh * $this->iScale);
		}

		$aImg->CopyMerge(
			$gdimg,
			$this->iX,
			$this->iY,
			0,
			0,
			round($iconw * $this->iScale),
			round($iconh * $this->iScale),
			$iconw,
			$iconh,
			$this->iMix
		);
	}
}
